<?php
/**
 * Clase abstracta encargada de definir la interfaz con las bases de datos
 * y de mantener un singleton de la instancia concreta de ConexionBD.
 * 
 * @author Willy A. Kuster
 */
abstract class ConexionBD {
	
	private static $instancia;
	
	public static function getConexionBD()
	{
		if (!isset(self::$instancia)) {
			$claseConexion = conf("conexion_bd","conector","clase");
			$rutaConexion = conf("conexion_bd","conector","ruta");
			
			def($rutaConexion,$claseConexion);
			
			self::$instancia = new $claseConexion();
		}
		return self::$instancia;
	}
	
	/**
	 * Crea una conexión a una base de datos usando la información d
	 * configuración y selecciona una base de datos.
	 */
	public abstract function conectar();

	/**
	 * Cierra la conexión a la base de datos.
	 */
	public abstract function desconectar();

	/**
	 * Ejecuta un query de tipo SELECT y devuelve el resultado generado.
	 *
	 * @param $query
	 * 			El query a ejecutar.
	 * @return Un 'resource'.
	 */
	public abstract function seleccionar($query);

	/**
	 * Ejecuta un query de tipo INSERT y devuelve el id del elemento insertado.
	 *
	 * @param $query
	 * 			El query a ejecutar.
	 * @return El id del elemento insertado.
	 */
	public abstract function insertar($query);

	/**
	 * Ejecuta un query de tipo UPDATE o DELETE y devuelve el número de filas
	 * que fueron afectadas.
	 *
	 * @param $query
	 * 			El query a ejecutar.
	 * @return El número de filas que fueron afectadas.
	 */
	public abstract function actualizarOEliminar($query);

	/**
	 * Concreta la transacción actual.
	 */
	public abstract function concretar();

	/**
	 * Deshace la transacción actual.
	 */
	public abstract function deshacer();

	/**
	 * Escapa la cadena ingresada de acuerdo al tipo de conexión.
	 * 
	 * @param $cadena
	 * 			La cadena a escapar.
	 * @return La cadena escapada.
	 */
	public abstract function escaparCadena($cadena);
	
	/**
	 * Reinicia la secuencia de Auto_increment para la tabla especificada.
	 * 
	 * @param $tabla
	 * 			El nombre de la tabla.
	 */
	public abstract function reiniciarAutoincrement($tabla);
	
}
?>